package com.alan.android.sqlite.utils;

import android.util.Log;

import com.alan.android.sqlite.converters.ColumnConverterFactory;
import com.alan.android.sqlite.converters.IColumnConverter;
import com.alan.android.sqlite.table.Column;
import com.alan.android.sqlite.table.Table;
import com.alan.android.sqlite.table.TableFactory;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

//数据库帮助类
public class DatabaseHelper {

    private static String TAG = "DatabaseHelper";


    /**
     * 根据给定对象准备用于SQL查询的条件参数
     * 该方法遍历对象的属性，找出主键列，并构建一个用于查询的参数数组
     * 主要用于支持动态构建SQL查询语句的WHERE子句
     *
     * @param t               要处理的对象实例
     * @param stringBuilder   用于拼接动态SQL条件的StringBuilder对象
     *                        （在方法外部创建并传入，内部仅使用其append方法）
     * @return                包含所有主键列值的字符串数组，用于SQL查询的参数
     */
    public static String[] whereIdArgs(Object t, StringBuilder stringBuilder) {
        // 创建一个列表来存储主键列的值
        List<String> list = new ArrayList<>();

        // 获取对象对应的表结构
        Table table = TableFactory.getTable(t.getClass());
        // 获取表的所有列
        Collection<Column> columns = table.getColumns().values();
        // 遍历所有列
        for (Column column : columns) {
            // 检查当前列是否为主键列
            if (column.isPrimaryKey()) {
                // 拼接SQL条件参数占位符
                stringBuilder.append(column.getName()).append("=?");
                // 将主键列的值添加到列表中
                list.add(getValue(t, column));
            }
        }
        // 将列表转换为数组并返回
        String[] array = new String[list.size()];
        list.toArray(array);
        return array;
    }


    /**
     * 从给定对象中获取列值并转换为字符串
     * 此方法用于提取指定列对象的值，并将其转换为字符串表示
     * 如果访问对象的字段时出现非法访问异常，方法将记录错误并返回空字符串
     *
     * @param t     从其中获取值的对象
     * @param column 代表要获取值的列对象
     * @return 从对象中提取的列值的字符串表示，如果无法访问则返回空字符串
     */
    public static String getValue(Object t, Column column) {
        try {
            // 尝试获取对象t中由column表示的列的值，并转换为字符串
            return convertToStringValues(column.getColumnField().get(t));
        } catch (IllegalAccessException e) {
            // 如果访问过程中出现异常，记录异常信息
            Log.w(TAG, Log.getStackTraceString(e));
        }
        // 如果出现异常，返回空字符串
        return "";
    }
    /**
     * 把绑定的值转化为 字符串形式的绑定的值，但是必须先进行转化器转化一下
     */
    private static String convertToStringValues(Object value) {
        // 得到对应类型的转化器
        IColumnConverter converter = ColumnConverterFactory.getColumnConverter(value);
        // 从java类型的数据转化成sql保存的数据类�?
        value = converter.toSqlValue(value);
        // 转化为字符串
        return String.valueOf(value);
    }
}
